/*************************************************************************
 * Copyright (c) 2017-2019, NVIDIA CORPORATION. All rights reserved.
 *
 * See LICENSE.txt for license information
 ************************************************************************/

#ifndef NCCL1_COMPAT_H
#define NCCL1_COMPAT_H

#ifndef NCCL_MAJOR    // NCCL 1.x
#define NCCL_MAJOR 1
#define NCCL_MINOR 0

#define ncclNumOps nccl_NUM_OPS
#define ncclNumTypes nccl_NUM_TYPES

static ncclResult_t ncclGroupStart() { return ncclSuccess; }
static ncclResult_t ncclGroupEnd()   { return ncclSuccess; }

#define CHECKCOUNT(count) if (count > INT_MAX) return ncclInvalidArgument;

static ncclResult_t ncclReduce(const void* sendbuff, 
                              void* recvbuff, 
                              size_t count, 
                              ncclDataType_t datatype, 
                              ncclRedOp_t op, 
                              int root,
                              ncclComm_t comm, 
                              cudaStream_t stream) {
  CHECKCOUNT(count);
  return ncclReduce(sendbuff, 
                    recvbuff, 
                    (int)count, 
                    datatype, 
                    op, 
                    root, 
                    comm, 
                    stream
                  );
}

static ncclResult_t ncclAllReduce(const void* sendbuff, 
                                  void* recvbuff, 
                                  size_t count,
                                  ncclDataType_t datatype, 
                                  ncclRedOp_t op, 
                                  ncclComm_t comm, 
                                  cudaStream_t stream) {
  CHECKCOUNT(count);
  return ncclAllReduce(sendbuff, 
                      recvbuff, 
                      (int)count, 
                      datatype, 
                      op, 
                      comm, 
                      stream
                    );
}

static ncclResult_t ncclBcast(void* buff, 
                              size_t count, 
                              ncclDataType_t datatype, 
                              int root,
                              ncclComm_t comm, 
                              cudaStream_t stream) {
  CHECKCOUNT(count);
  return ncclBcast(buff, 
                  (int)count, 
                  datatype, 
                  root, 
                  comm, 
                  stream
                );
}
static ncclResult_t ncclReduceScatter(const void* sendbuff, 
                                      void* recvbuff,
                                      size_t recvcount, 
                                      ncclDataType_t datatype, 
                                      ncclRedOp_t op, 
                                      ncclComm_t comm,
                                      cudaStream_t stream) {
  CHECKCOUNT(recvcount);
  return ncclReduceScatter(sendbuff, 
                          recvbuff, 
                          (int)recvcount, 
                          datatype, 
                          op, 
                          comm, 
                          stream
                        );
}

static ncclResult_t ncclAllGather(const void* sendbuff, 
                                  void* recvbuff, 
                                  size_t sendcount,
                                  ncclDataType_t datatype, 
                                  ncclComm_t comm, 
                                  cudaStream_t stream) {
  CHECKCOUNT(sendcount);
  return ncclAllGather(sendbuff, 
                      (int)sendcount, 
                      datatype, 
                      recvbuff, 
                      comm, 
                      stream
                    );
}

#endif   //!  NCCL_MAJOR
#endif   //!  NCCL1_COMPAT_H
